Особенности использования события ПриПолученииДанных табличного поля

Событие ПриПолученииДанных используется для оформления ячеек строк данных, отображаемых табличным полем. Обработчик данного события вызывается табличным полем в тех же случаях, что и обработчик события ПриВыводеСтроки, т.е. при обновлении данных, отображаемых табличным полем или при поиске по подстроке. Важно отметить, что обработчик данного события вызывается табличным полем перед вызовом обработчиков события ПриВыводеСтроки  для всех видимых строк табличного поля. Основным отличием данного события от события ПриВыводеСтроки является то, что в обработчике события ПриПолученииДанных можно изменять настройки ячеек группы строк, а не одной строки, как в обработчике события ПриВыводеСтроки.

Обрабатывая данное событие можно изменять шрифт, цвет фона или текста, как определенной ячейки, так и всей строки табличного поля, устанавливать высоту или видимость ячеек строки табличного поля, а также устанавливать картинку, флажок или новый текст в ячейке.  Параметром данного события является объект типа ОформленияСтрок - коллекция объектов типа ОформлениеСтроки, являющихся оформлениями видимых строк табличного поля.

Важно отметить, что в некоторых случаях обработчик события ПриПолученииДанных может вызываться табличным полем при обновлении более одного раза. Например, если текущая строка табличного поля находится в середине видимой области, то при обновлении обработчик события ПриПолученииДанных будет вызван табличным полем два раза: первый раз для группы строк, начиная с текущей строки до верхней видимой и второй раз для строки, следующей за текущей до нижней видимой строки. Такое поведение табличного поля связано с тем, что при обновлении табличное поле пытается сохранить позицию текущей строки в видимой области.

Поясним использование события ПриПолученииДанных на следующем примере. Пусть существует форма списка справочника "Номенклатура" с двумя табличными полями. Пусть одно из табличных полей отображает указанный список справочника как дерево, а другое как иерархический список. Требуется в табличном поле, отображающем данные как иерархический список, отображать остатки по позициям номенклатуры.

Наиболее эффективным способом для решения данной задачи является использование события ПриПолученииДанных. В обработчике данного события формируется запрос к регистру накопления "УчетНоменклатуры" для получения остатков. В качестве параметра данного запроса передается массив, содержащий ссылки на отображаемые строки табличного поля. Затем выполняется запрос и получается выборка. Полученная выборка обходится и значения остатков устанавливаются ячейке "Остаток".

Копировать в буфер обмена
Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)

    // Соответствие создается для заполнения остатков в строках табличного поля
    Соответствие = Новый Соответствие; 

    // Заполнение параметра - массива значений ссылками на отображаемые строки табличного поля
    СсылкиМассив = Новый Массив;
    Для каждого Стр из ОформленияСтрок Цикл

        СсылкиМассив.Добавить(Стр.ДанныеСтроки.Ссылка);
        Соответствие.Вставить(Стр.ДанныеСтроки.Ссылка, Стр);

    КонецЦикла;

    // Сформировать запрос для получения остатков
    ЗапросОстатка = Новый Запрос;
    ЗапросОстатка.Текст = "ВЫБРАТЬ
                           | УчетНоменклатурыОстатки.Номенклатура,
                           | УчетНоменклатурыОстатки.КоличествоОстаток
                           |ИЗ
                           | РегистрНакопления.УчетНоменклатуры.Остатки(, Номенклатура В (&Номенклатура)) КАК УчетНоменклатурыОстатки";

    ЗапросОстатка.УстановитьПараметр("Номенклатура", СсылкиМассив);
    Выборка = ЗапросОстатка.Выполнить().Выбрать();

    //Вывести остаток в строку, найденную в соответствии по номенклатуре из запроса
    Пока Выборка.Следующий() Цикл

        Соответствие.Получить(Выборка.Номенклатура).Ячейки.Остаток.Значение = Выборка.КоличествоОстаток;

    КонецЦикла; 

КонецПроцедуры